/*
 * CircularQueue.java
 * Autor: Jennifer Pamela Valdez Cabrera
 * Carne: 10189
 * Fecha de entrega: 3 de septiembre de 2011
 * Descripcion: Es la implementación de colas circulares
*/

public class CircularQueue<E> extends AbstractQueue<E> {
    
    private E[] data;
    private int head;
    private int tail;
    
    // constructor del arrayQueue
    public CircularQueue(int numElements){
        this.numElements = numElements;
        head = 0;
        tail = this.numElements-1;
        data = (E[]) new Object[numElements];
    }
    
    /* 
      ---------------------------------------------------------------------
      add: agrega un elemento a la cola, el cual es recibido como
              parametro y no devuelve ningun valor.
      ---------------------------------------------------------------------
    */ 
    public void add(E value) {
        if (!(isFull())) {
            tail++;
            tail = tail % numElements;
            data[tail] = value;
            cont++;
        }
        else
            System.out.println("LA COLA ESTA LLENA!");
    }

    /* 
        ---------------------------------------------------------------------
        remove: obtiene el elemento al cual le toca salir y lo remueve de la
                cola si no esta vacio; dicho elemento es devuelto
        ---------------------------------------------------------------------
    */ 
    public E remove() {
        E temp = null;
        if (!(isEmpty())) {
            temp = data[head];
            cont--;
            head++;
            head = head % numElements;
        }
        else
            System.out.println("LA COLA ESTA VACIA!");
        return temp;
    }
    
    /* 
        ---------------------------------------------------------------------
        peek: devuelve el elemento proximo a ser removido
        ---------------------------------------------------------------------
    */ 
    public E peek() {
        E temp = null;
        if (!(isEmpty()))
            temp = data[head];
        else
            System.out.println("LA COLA ESTA VACIA!");
        return temp;
    }
}
